package com.uacp.sgb.vista.controladores;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import com.uacp.sgb.datos.dominio.entidades.Adquisicion;
import com.uacp.sgb.datos.dominio.entidades.Dependencia;
import com.uacp.sgb.datos.dominio.entidades.Pecosa;
import com.uacp.sgb.datos.dominio.entidades.Trabajador;
import com.uacp.sgb.datos.dominio.persistencia.dao.AdquisicionDao;
import com.uacp.sgb.datos.dominio.persistencia.dao.DependenciaDao;
import com.uacp.sgb.datos.dominio.persistencia.dao.PecosaDao;
import com.uacp.sgb.datos.dominio.persistencia.dao.TrabajadorDao;
import com.uacp.sgb.negocio.servicios.ServicioBienes;
import com.uacp.sgb.vista.util.DialogBean;

@ManagedBean(name="valAdquisicion")
@ViewScoped
public class ControlValidarAdquisicion implements Serializable
{
	private Adquisicion adquisicion;
	private Dependencia dependencia;
	private List<Trabajador> trabajadores;
	private List<Dependencia> dependencias;
	private List<Dependencia> areas;
	private String codPecosa;
	private String numInforme;
	
	public ControlValidarAdquisicion()
	{
		
	}
	
	public void validarAdquisicion(ActionEvent event)
	{
		ServicioBienes.asignarCodigosSBN(adquisicion.getEquipos(), adquisicion.getMuebles());
		
		adquisicion.setEstado("V");
		AdquisicionDao.actualizar(adquisicion);
		
		DialogBean.validacionAdquisicion();
	}
	
	public void buscarAdquisicion()
	{
		Pecosa pecosa = PecosaDao.buscar(codPecosa);
		
		if(pecosa != null)			
		{
			adquisicion = AdquisicionDao.buscarPorPecosa(pecosa);
			dependencia = DependenciaDao.buscarPorNombre(adquisicion.getArea().getDependencia());
			
			String mensaje = null;
			
			switch(adquisicion.getEstado())
			{
			case "R": mensaje = "Estado: Rechazado"; break;
			case "E": mensaje = "Estado: Enviado"; break;
			case "V": mensaje = "Estado: Validado"; break;
			}
			
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, mensaje, null);
			FacesContext.getCurrentInstance().addMessage(null, msg);
			
			actualizarAreas();
			actualizarTrabajadores();
		}
		else
		{
			adquisicion = null;
			
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Nro de PECOSA no existe", null);
			FacesContext.getCurrentInstance().addMessage(null, msg);
		}
	}

	private void actualizarAreas()
	{
		areas = DependenciaDao.listarAreas(dependencia);
		System.out.println("Cantidad de aresa: " + areas.size());
	}
	
	private void actualizarTrabajadores()
	{
		trabajadores = TrabajadorDao.listarPorArea(dependencia);
		System.out.println("Cantidad de trabajadores: " + trabajadores.size());
	}
	
	public String getNombreCompleto() 
	{
		if(adquisicion != null)
			return adquisicion.getTrabajador().getApellidos() + " " + adquisicion.getTrabajador().getNombres();
		else
			return "";
	}
	
	public List<Dependencia> filtrarAreas(String filtro)
	{
		filtro = filtro.trim().toLowerCase();
		
		List<Dependencia> filtradas = new ArrayList<>();
		
		for(Dependencia dependencia: areas)
		{
			if(dependencia.getNombre().toLowerCase().startsWith(filtro) || dependencia.getCodigo().toLowerCase().startsWith(filtro) )
				filtradas.add(dependencia);
			
		}
		
		return filtradas;
	}
	
	public List<Trabajador> filtrarTrabajador(String filtro)
	{
		filtro = filtro.trim().toLowerCase();
		
		List<Trabajador> filtradas = new ArrayList<>();
		
		for(Trabajador trabajador: trabajadores)
		{
			if(trabajador.getNroDoc().toLowerCase().startsWith(filtro))
				filtradas.add(trabajador);
		}
		
		return filtradas;
	}
	
	public Adquisicion getAdquisicion() {
		return adquisicion;
	}

	public void setAdquisicion(Adquisicion adquisicion) {
		this.adquisicion = adquisicion;
	}

	public List<Trabajador> getTrabajadores() {
		return trabajadores;
	}

	public void setTrabajadores(List<Trabajador> trabajadores) {
		this.trabajadores = trabajadores;
	}

	public List<Dependencia> getDependencias() {
		return dependencias;
	}

	public void setDependencias(List<Dependencia> dependencias) {
		this.dependencias = dependencias;
	}

	public List<Dependencia> getAreas() {
		return areas;
	}

	public void setAreas(List<Dependencia> areas) {
		this.areas = areas;
	}

	public String getCodPecosa() {
		return codPecosa;
	}

	public void setCodPecosa(String codPecosa) {
		this.codPecosa = codPecosa;
	}

	public Dependencia getDependencia() {
		return dependencia;
	}

	public void setDependencia(Dependencia dependencia) {
		this.dependencia = dependencia;
	}

	public String getNumInforme() {
		return numInforme;
	}

	public void setNumInforme(String numInforme) {
		this.numInforme = numInforme;
	}
}
